package com.heima.user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.heima.common.dto.ResponseResult;
import com.heima.common.enums.AppHttpCodeEnum;
import com.heima.common.util.AppJwtUtil;
import com.heima.user.dto.LoginDto;
import com.heima.user.entity.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.IApUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * APP用户信息表 服务实现类
 * </p>
 *
 * @author gq
 * @since 2022-06-21
 */
@Service
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements IApUserService {
    /**
     * APP登录
     *
     * @param dto
     * @return
     */
    @Override
    public ResponseResult login(LoginDto dto) {
//        参数校验
        if (dto == null || (
                StringUtils.isEmpty(dto.getPhone()) &&
                        StringUtils.isEmpty(dto.getPassword()) &&
                        StringUtils.isEmpty(dto.getEquipmentId())
        )) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
//        手机号和密码不为空，使用手机号登录
        if (!StringUtils.isEmpty(dto.getPhone()) && !StringUtils.isEmpty(dto.getPassword())) {

            //        根据手机号查询
            LambdaQueryWrapper<ApUser> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(ApUser::getPhone, dto.getPhone());
            ApUser one = this.getOne(queryWrapper);
//        如果没有查到，提示没有此用户
            if (one == null) {
                return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
            }
//        如果有，获取表中的盐
            String salt = one.getSalt();
//        使用前端传入的密码拼接盐.进行md5计算得到密码
            String userPasswordBefore = dto.getPassword() + salt;
            String userPasswordAfter = DigestUtils.md5DigestAsHex(userPasswordBefore.getBytes());
//        与数据库中的密码进行对比
            if (!one.getPassword().equals(userPasswordAfter)) {
//        不一致,提示密码不正确
                return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_NAME_OR_PASSWORD_ERROR);
            }
//        密码正确，使用jwt生成token，将用户ID放到jwt的自定义声明中
            Map<String, Object> userMap = new HashMap<>();
            userMap.put("userId", one.getId());
            String token = AppJwtUtil.getToken(userMap);
//        定义格式，返回给前端
            Map<String, Object> ret = new HashMap();
            ret.put("token", token);
//        去除敏感
            one.setPassword(null);
            one.setSalt(null);
            one.setPhone(null);
            ret.put("user", one);
            return ResponseResult.okResult(ret);

        }

//        游客登录 为了能通过网关，使用默认 0 作为用户ID生成token
        if (!StringUtils.isEmpty(dto.getEquipmentId())){
            Map<String, Object> userMap = new HashMap<>();
            userMap.put("userId", "0");
            String token = AppJwtUtil.getToken(userMap);
//        定义格式，返回给前端
            Map<String, Object> ret = new HashMap();
            ret.put("token", token);
            return ResponseResult.okResult(ret);
        }
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
    }
}
